// 91. 解码方法
// 一条包含字母 A-Z 的消息通过以下映射进行了 编码 ：
//
// 'A' -> "1"
// 'B' -> "2"
// ...
// 'Z' -> "26"
// 要 解码 已编码的消息，所有数字必须基于上述映射的方法，反向映射回字母（可能有多种方法）。例如，"11106" 可以映射为：
//
// "AAJF" ，将消息分组为 (1 1 10 6)
// "KJF" ，将消息分组为 (11 10 6)
// 注意，消息不能分组为  (1 11 06) ，因为 "06" 不能映射为 "F" ，这是由于 "6" 和 "06" 在映射中并不等价。
//
// 给你一个只含数字的 非空 字符串 s ，请计算并返回 解码 方法的 总数 。
//
// 题目数据保证答案肯定是一个 32 位 的整数。

/**
 * @param {string} s
 * @return {number}
 */
var numDecodings = function (s) {
  const len = s.length
  const dp = new Array(len).fill(0)

  const ch = s[0]
  dp[0] = ('1' <= ch && '9' >= ch) ? 1 : 0

  for (let i = 1; i < len; i++) {
    // 两个字符
    if (i >= 1) {
      const n = parseInt(s.slice(i - 1, i + 1), 10)
      if (9 < n && 26 >= n) {
        dp[i] += (i - 2 < 0) ? 1 : dp[i - 2]
      }
    }
    // 一个字符
    if (i >= 0) {
      const n = parseInt(s[i], 10)
      if (0 < n && 9 >= n) {
        dp[i] += (i - 1 < 0) ? 1 : dp[i - 1]
      }
    }
  }

  return dp[len - 1]
}

console.log(
  numDecodings(
    '226'
  )
)
